{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Introductory CNN Model: MNIST Digits\n",
    "\n",
    "----------------------------------\n",
    "\n",
    "In this example, we will download the MNIST handwritten digits and create a simple CNN network to predict the digit category (0-9).\n",
    "\n",
    "To start, we load the necessary libraries."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from tensorflow.python.framework import ops\n",
    "ops.reset_default_graph()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Start a computational graph session:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Start a graph session\n",
    "sess = tf.Session()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "TensorFlow has a built in method for loading the MNIST data sets.  It checks to see if you have downloaded it before, and if not, downloads and saves the files for you."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.\n",
      "Extracting temp/train-images-idx3-ubyte.gz\n",
      "Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.\n",
      "Extracting temp/train-labels-idx1-ubyte.gz\n",
      "Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.\n",
      "Extracting temp/t10k-images-idx3-ubyte.gz\n",
      "Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.\n",
      "Extracting temp/t10k-labels-idx1-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "# Load data\n",
    "data_dir = 'temp'\n",
    "mnist = input_data.read_data_sets(data_dir, one_hot=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we convert the images to have a size of 28x28.  They are downloaded as a 1x784 array."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Convert images into 28x28 (they are downloaded as 1x784)\n",
    "train_xdata = np.array([np.reshape(x, (28,28)) for x in mnist.train.images])\n",
    "test_xdata = np.array([np.reshape(x, (28,28)) for x in mnist.test.images])\n",
    "\n",
    "# Convert labels into one-hot encoded vectors\n",
    "train_labels = mnist.train.labels\n",
    "test_labels = mnist.test.labels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we set the model parameters as follows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Set model parameters\n",
    "batch_size = 100\n",
    "learning_rate = 0.005\n",
    "evaluation_size = 500\n",
    "image_width = train_xdata[0].shape[0]\n",
    "image_height = train_xdata[0].shape[1]\n",
    "target_size = np.max(train_labels) + 1\n",
    "num_channels = 1 # greyscale = 1 channel\n",
    "generations = 500\n",
    "eval_every = 5\n",
    "conv1_features = 25\n",
    "conv2_features = 50\n",
    "max_pool_size1 = 2 # NxN window for 1st max pool layer\n",
    "max_pool_size2 = 2 # NxN window for 2nd max pool layer\n",
    "fully_connected_size1 = 100"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Declare model placeholders.  Remember that we need placeholders for the training data and the evaluation data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x_input_shape = (batch_size, image_width, image_height, num_channels)\n",
    "x_input = tf.placeholder(tf.float32, shape=x_input_shape)\n",
    "y_target = tf.placeholder(tf.int32, shape=(batch_size))\n",
    "\n",
    "eval_input_shape = (evaluation_size, image_width, image_height, num_channels)\n",
    "eval_input = tf.placeholder(tf.float32, shape=eval_input_shape)\n",
    "eval_target = tf.placeholder(tf.int32, shape=(evaluation_size))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here we declare model parameters.  For this model we will have two convolutional layers (each having filter size 4x4).  We follow this with two fully connected layers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Convolutional layer variables\n",
    "conv1_weight = tf.Variable(tf.truncated_normal([4, 4, num_channels, conv1_features],\n",
    "                                               stddev=0.1, dtype=tf.float32))\n",
    "conv1_bias = tf.Variable(tf.zeros([conv1_features], dtype=tf.float32))\n",
    "\n",
    "conv2_weight = tf.Variable(tf.truncated_normal([4, 4, conv1_features, conv2_features],\n",
    "                                               stddev=0.1, dtype=tf.float32))\n",
    "conv2_bias = tf.Variable(tf.zeros([conv2_features], dtype=tf.float32))\n",
    "\n",
    "# Fully connected variables\n",
    "resulting_width = image_width // (max_pool_size1 * max_pool_size2)\n",
    "resulting_height = image_height // (max_pool_size1 * max_pool_size2)\n",
    "full1_input_size = resulting_width * resulting_height * conv2_features\n",
    "full1_weight = tf.Variable(tf.truncated_normal([full1_input_size, fully_connected_size1],\n",
    "                          stddev=0.1, dtype=tf.float32))\n",
    "full1_bias = tf.Variable(tf.truncated_normal([fully_connected_size1], stddev=0.1,\n",
    "                                             dtype=tf.float32))\n",
    "full2_weight = tf.Variable(tf.truncated_normal([fully_connected_size1, target_size],\n",
    "                                               stddev=0.1, dtype=tf.float32))\n",
    "full2_bias = tf.Variable(tf.truncated_normal([target_size], stddev=0.1, dtype=tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After we have the layer variables, we can create the model operations.\n",
    "\n",
    "   (Convolutional layer 1) --> (ReLU 1) --> (Max Pool 1) -->\n",
    "\n",
    "\n",
    "-->(Convolutional layer 2) --> (ReLU 2) --> (Max Pool 2) -->\n",
    "\n",
    "\n",
    "-->(Fully Connected Layer 1) --> (Fully Connected Layer 2) --> Prediction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Initialize Model Operations\n",
    "def my_conv_net(input_data):\n",
    "    # First Conv-ReLU-MaxPool Layer\n",
    "    conv1 = tf.nn.conv2d(input_data, conv1_weight, strides=[1, 1, 1, 1], padding='SAME')\n",
    "    relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_bias))\n",
    "    max_pool1 = tf.nn.max_pool(relu1, ksize=[1, max_pool_size1, max_pool_size1, 1],\n",
    "                               strides=[1, max_pool_size1, max_pool_size1, 1], padding='SAME')\n",
    "\n",
    "    # Second Conv-ReLU-MaxPool Layer\n",
    "    conv2 = tf.nn.conv2d(max_pool1, conv2_weight, strides=[1, 1, 1, 1], padding='SAME')\n",
    "    relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_bias))\n",
    "    max_pool2 = tf.nn.max_pool(relu2, ksize=[1, max_pool_size2, max_pool_size2, 1],\n",
    "                               strides=[1, max_pool_size2, max_pool_size2, 1], padding='SAME')\n",
    "\n",
    "    # Transform Output into a 1xN layer for next fully connected layer\n",
    "    final_conv_shape = max_pool2.get_shape().as_list()\n",
    "    final_shape = final_conv_shape[1] * final_conv_shape[2] * final_conv_shape[3]\n",
    "    flat_output = tf.reshape(max_pool2, [final_conv_shape[0], final_shape])\n",
    "\n",
    "    # First Fully Connected Layer\n",
    "    fully_connected1 = tf.nn.relu(tf.add(tf.matmul(flat_output, full1_weight), full1_bias))\n",
    "\n",
    "    # Second Fully Connected Layer\n",
    "    final_model_output = tf.add(tf.matmul(fully_connected1, full2_weight), full2_bias)\n",
    "    \n",
    "    return final_model_output\n",
    "\n",
    "model_output = my_conv_net(x_input)\n",
    "test_model_output = my_conv_net(eval_input)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will us the softmax cross entropy loss."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Declare Loss Function (softmax cross entropy)\n",
    "loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=model_output, labels=y_target))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also create a prediction and accuracy function for evaluation on the train and test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Create a prediction function\n",
    "prediction = tf.nn.softmax(model_output)\n",
    "test_prediction = tf.nn.softmax(test_model_output)\n",
    "\n",
    "# Create accuracy function\n",
    "def get_accuracy(logits, targets):\n",
    "    batch_predictions = np.argmax(logits, axis=1)\n",
    "    num_correct = np.sum(np.equal(batch_predictions, targets))\n",
    "    return 100. * num_correct/batch_predictions.shape[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, we will use the Momentum Optimizer with a learning rate of `0.005` and a decay rate of `0.9`.  Then we initialize our model variables."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Create an optimizer\n",
    "my_optimizer = tf.train.MomentumOptimizer(learning_rate, 0.9)\n",
    "train_step = my_optimizer.minimize(loss)\n",
    "\n",
    "# Initialize Variables\n",
    "init = tf.global_variables_initializer()\n",
    "sess.run(init)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can start training!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation # 5. Train Loss: 2.29. Train Acc (Test Acc): 11.00 (10.80)\n",
      "Generation # 10. Train Loss: 2.15. Train Acc (Test Acc): 28.00 (28.80)\n",
      "Generation # 15. Train Loss: 2.08. Train Acc (Test Acc): 32.00 (31.40)\n",
      "Generation # 20. Train Loss: 1.92. Train Acc (Test Acc): 49.00 (51.60)\n",
      "Generation # 25. Train Loss: 1.69. Train Acc (Test Acc): 56.00 (59.60)\n",
      "Generation # 30. Train Loss: 1.46. Train Acc (Test Acc): 62.00 (57.80)\n",
      "Generation # 35. Train Loss: 1.17. Train Acc (Test Acc): 71.00 (73.20)\n",
      "Generation # 40. Train Loss: 0.78. Train Acc (Test Acc): 82.00 (68.40)\n",
      "Generation # 45. Train Loss: 0.75. Train Acc (Test Acc): 82.00 (77.00)\n",
      "Generation # 50. Train Loss: 0.57. Train Acc (Test Acc): 81.00 (81.20)\n",
      "Generation # 55. Train Loss: 0.47. Train Acc (Test Acc): 86.00 (81.60)\n",
      "Generation # 60. Train Loss: 0.53. Train Acc (Test Acc): 86.00 (80.80)\n",
      "Generation # 65. Train Loss: 0.50. Train Acc (Test Acc): 84.00 (88.40)\n",
      "Generation # 70. Train Loss: 0.37. Train Acc (Test Acc): 88.00 (86.60)\n",
      "Generation # 75. Train Loss: 0.37. Train Acc (Test Acc): 91.00 (89.40)\n",
      "Generation # 80. Train Loss: 0.42. Train Acc (Test Acc): 85.00 (87.20)\n",
      "Generation # 85. Train Loss: 0.46. Train Acc (Test Acc): 87.00 (86.40)\n",
      "Generation # 90. Train Loss: 0.39. Train Acc (Test Acc): 87.00 (89.20)\n",
      "Generation # 95. Train Loss: 0.49. Train Acc (Test Acc): 83.00 (88.00)\n",
      "Generation # 100. Train Loss: 0.21. Train Acc (Test Acc): 94.00 (88.20)\n",
      "Generation # 105. Train Loss: 0.34. Train Acc (Test Acc): 87.00 (89.00)\n",
      "Generation # 110. Train Loss: 0.20. Train Acc (Test Acc): 94.00 (87.00)\n",
      "Generation # 115. Train Loss: 0.33. Train Acc (Test Acc): 89.00 (91.00)\n",
      "Generation # 120. Train Loss: 0.36. Train Acc (Test Acc): 86.00 (90.40)\n",
      "Generation # 125. Train Loss: 0.46. Train Acc (Test Acc): 84.00 (89.80)\n",
      "Generation # 130. Train Loss: 0.28. Train Acc (Test Acc): 90.00 (90.20)\n",
      "Generation # 135. Train Loss: 0.28. Train Acc (Test Acc): 91.00 (90.40)\n",
      "Generation # 140. Train Loss: 0.18. Train Acc (Test Acc): 96.00 (92.00)\n",
      "Generation # 145. Train Loss: 0.22. Train Acc (Test Acc): 94.00 (91.40)\n",
      "Generation # 150. Train Loss: 0.29. Train Acc (Test Acc): 91.00 (92.00)\n",
      "Generation # 155. Train Loss: 0.26. Train Acc (Test Acc): 93.00 (94.80)\n",
      "Generation # 160. Train Loss: 0.34. Train Acc (Test Acc): 92.00 (93.20)\n",
      "Generation # 165. Train Loss: 0.36. Train Acc (Test Acc): 91.00 (91.20)\n",
      "Generation # 170. Train Loss: 0.48. Train Acc (Test Acc): 88.00 (92.40)\n",
      "Generation # 175. Train Loss: 0.28. Train Acc (Test Acc): 93.00 (93.20)\n",
      "Generation # 180. Train Loss: 0.35. Train Acc (Test Acc): 87.00 (92.20)\n",
      "Generation # 185. Train Loss: 0.31. Train Acc (Test Acc): 92.00 (94.20)\n",
      "Generation # 190. Train Loss: 0.26. Train Acc (Test Acc): 90.00 (92.60)\n",
      "Generation # 195. Train Loss: 0.32. Train Acc (Test Acc): 91.00 (94.80)\n",
      "Generation # 200. Train Loss: 0.18. Train Acc (Test Acc): 94.00 (93.60)\n",
      "Generation # 205. Train Loss: 0.28. Train Acc (Test Acc): 91.00 (92.40)\n",
      "Generation # 210. Train Loss: 0.24. Train Acc (Test Acc): 95.00 (92.40)\n",
      "Generation # 215. Train Loss: 0.23. Train Acc (Test Acc): 93.00 (93.00)\n",
      "Generation # 220. Train Loss: 0.17. Train Acc (Test Acc): 95.00 (94.20)\n",
      "Generation # 225. Train Loss: 0.22. Train Acc (Test Acc): 94.00 (94.60)\n",
      "Generation # 230. Train Loss: 0.30. Train Acc (Test Acc): 94.00 (94.60)\n",
      "Generation # 235. Train Loss: 0.25. Train Acc (Test Acc): 93.00 (95.20)\n",
      "Generation # 240. Train Loss: 0.17. Train Acc (Test Acc): 95.00 (92.80)\n",
      "Generation # 245. Train Loss: 0.29. Train Acc (Test Acc): 85.00 (93.80)\n",
      "Generation # 250. Train Loss: 0.10. Train Acc (Test Acc): 97.00 (95.00)\n",
      "Generation # 255. Train Loss: 0.33. Train Acc (Test Acc): 91.00 (93.00)\n",
      "Generation # 260. Train Loss: 0.16. Train Acc (Test Acc): 96.00 (93.00)\n",
      "Generation # 265. Train Loss: 0.34. Train Acc (Test Acc): 89.00 (95.00)\n",
      "Generation # 270. Train Loss: 0.14. Train Acc (Test Acc): 97.00 (93.20)\n",
      "Generation # 275. Train Loss: 0.16. Train Acc (Test Acc): 96.00 (96.60)\n",
      "Generation # 280. Train Loss: 0.09. Train Acc (Test Acc): 98.00 (95.60)\n",
      "Generation # 285. Train Loss: 0.23. Train Acc (Test Acc): 96.00 (97.20)\n",
      "Generation # 290. Train Loss: 0.20. Train Acc (Test Acc): 94.00 (94.60)\n",
      "Generation # 295. Train Loss: 0.14. Train Acc (Test Acc): 97.00 (95.40)\n",
      "Generation # 300. Train Loss: 0.19. Train Acc (Test Acc): 93.00 (94.20)\n",
      "Generation # 305. Train Loss: 0.23. Train Acc (Test Acc): 92.00 (95.40)\n",
      "Generation # 310. Train Loss: 0.13. Train Acc (Test Acc): 96.00 (94.60)\n",
      "Generation # 315. Train Loss: 0.19. Train Acc (Test Acc): 97.00 (95.00)\n",
      "Generation # 320. Train Loss: 0.27. Train Acc (Test Acc): 92.00 (97.00)\n",
      "Generation # 325. Train Loss: 0.20. Train Acc (Test Acc): 94.00 (95.40)\n",
      "Generation # 330. Train Loss: 0.19. Train Acc (Test Acc): 92.00 (94.40)\n",
      "Generation # 335. Train Loss: 0.17. Train Acc (Test Acc): 94.00 (95.40)\n",
      "Generation # 340. Train Loss: 0.11. Train Acc (Test Acc): 96.00 (95.20)\n",
      "Generation # 345. Train Loss: 0.17. Train Acc (Test Acc): 94.00 (95.80)\n",
      "Generation # 350. Train Loss: 0.12. Train Acc (Test Acc): 98.00 (96.00)\n",
      "Generation # 355. Train Loss: 0.09. Train Acc (Test Acc): 98.00 (94.40)\n",
      "Generation # 360. Train Loss: 0.15. Train Acc (Test Acc): 97.00 (97.00)\n",
      "Generation # 365. Train Loss: 0.12. Train Acc (Test Acc): 98.00 (95.40)\n",
      "Generation # 370. Train Loss: 0.09. Train Acc (Test Acc): 98.00 (94.60)\n",
      "Generation # 375. Train Loss: 0.14. Train Acc (Test Acc): 96.00 (97.80)\n",
      "Generation # 380. Train Loss: 0.11. Train Acc (Test Acc): 97.00 (95.80)\n",
      "Generation # 385. Train Loss: 0.18. Train Acc (Test Acc): 93.00 (94.00)\n",
      "Generation # 390. Train Loss: 0.24. Train Acc (Test Acc): 92.00 (96.60)\n",
      "Generation # 395. Train Loss: 0.16. Train Acc (Test Acc): 97.00 (94.60)\n",
      "Generation # 400. Train Loss: 0.14. Train Acc (Test Acc): 97.00 (94.60)\n",
      "Generation # 405. Train Loss: 0.20. Train Acc (Test Acc): 92.00 (96.40)\n",
      "Generation # 410. Train Loss: 0.19. Train Acc (Test Acc): 94.00 (93.60)\n",
      "Generation # 415. Train Loss: 0.10. Train Acc (Test Acc): 98.00 (96.20)\n",
      "Generation # 420. Train Loss: 0.19. Train Acc (Test Acc): 95.00 (95.00)\n",
      "Generation # 425. Train Loss: 0.04. Train Acc (Test Acc): 100.00 (94.80)\n",
      "Generation # 430. Train Loss: 0.14. Train Acc (Test Acc): 96.00 (95.60)\n",
      "Generation # 435. Train Loss: 0.11. Train Acc (Test Acc): 98.00 (97.20)\n",
      "Generation # 440. Train Loss: 0.07. Train Acc (Test Acc): 97.00 (95.80)\n",
      "Generation # 445. Train Loss: 0.11. Train Acc (Test Acc): 97.00 (96.20)\n",
      "Generation # 450. Train Loss: 0.08. Train Acc (Test Acc): 98.00 (96.20)\n",
      "Generation # 455. Train Loss: 0.15. Train Acc (Test Acc): 95.00 (96.00)\n",
      "Generation # 460. Train Loss: 0.15. Train Acc (Test Acc): 95.00 (96.80)\n",
      "Generation # 465. Train Loss: 0.15. Train Acc (Test Acc): 95.00 (94.20)\n",
      "Generation # 470. Train Loss: 0.07. Train Acc (Test Acc): 97.00 (94.60)\n",
      "Generation # 475. Train Loss: 0.28. Train Acc (Test Acc): 92.00 (95.20)\n",
      "Generation # 480. Train Loss: 0.08. Train Acc (Test Acc): 98.00 (97.00)\n",
      "Generation # 485. Train Loss: 0.13. Train Acc (Test Acc): 95.00 (96.00)\n",
      "Generation # 490. Train Loss: 0.15. Train Acc (Test Acc): 96.00 (97.40)\n",
      "Generation # 495. Train Loss: 0.11. Train Acc (Test Acc): 96.00 (97.20)\n",
      "Generation # 500. Train Loss: 0.10. Train Acc (Test Acc): 98.00 (97.20)\n"
     ]
    }
   ],
   "source": [
    "# Start training loop\n",
    "train_loss = []\n",
    "train_acc = []\n",
    "test_acc = []\n",
    "for i in range(generations):\n",
    "    rand_index = np.random.choice(len(train_xdata), size=batch_size)\n",
    "    rand_x = train_xdata[rand_index]\n",
    "    rand_x = np.expand_dims(rand_x, 3)\n",
    "    rand_y = train_labels[rand_index]\n",
    "    train_dict = {x_input: rand_x, y_target: rand_y}\n",
    "    \n",
    "    sess.run(train_step, feed_dict=train_dict)\n",
    "    temp_train_loss, temp_train_preds = sess.run([loss, prediction], feed_dict=train_dict)\n",
    "    temp_train_acc = get_accuracy(temp_train_preds, rand_y)\n",
    "    \n",
    "    if (i+1) % eval_every == 0:\n",
    "        eval_index = np.random.choice(len(test_xdata), size=evaluation_size)\n",
    "        eval_x = test_xdata[eval_index]\n",
    "        eval_x = np.expand_dims(eval_x, 3)\n",
    "        eval_y = test_labels[eval_index]\n",
    "        test_dict = {eval_input: eval_x, eval_target: eval_y}\n",
    "        test_preds = sess.run(test_prediction, feed_dict=test_dict)\n",
    "        temp_test_acc = get_accuracy(test_preds, eval_y)\n",
    "        \n",
    "        # Record and print results\n",
    "        train_loss.append(temp_train_loss)\n",
    "        train_acc.append(temp_train_acc)\n",
    "        test_acc.append(temp_test_acc)\n",
    "        acc_and_loss = [(i+1), temp_train_loss, temp_train_acc, temp_test_acc]\n",
    "        acc_and_loss = [np.round(x,2) for x in acc_and_loss]\n",
    "        print('Generation # {}. Train Loss: {:.2f}. Train Acc (Test Acc): {:.2f} ({:.2f})'.format(*acc_and_loss))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's plot the loss and accuracies."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nOjg4mDVq1OCWLVvs6v75558MDg5mZmZmrtv88ssv2bdvX4/FOHz4cL7wwgt51rt06RKvvfZanj17\nlmFhYdws5oKjAAAaoklEQVSzZ4912dKlSxkZGckjR444rPf8888TAE+ePOmxmD3p8OHDBMBZs2Y5\nLLvttttYpkwZrlu3rugDU8oEvU+i5CpXrhxq1KiBo0ePAgC2bt2KWrVq4c4770R8fLxd3TVr1qBb\nt24oW7Zsrtts1aqVxzqvjx49iuXLl+Phhx/Os26VKlVQq1YtjBw5En379kWTJk2sy/r164dHH30U\nw4cPh8VisZafOHECM2bMQLt27Rzer6c8//zz+Prrrwu8/t69xsz2OX8DHTCuJHr16oVdu3YVePtK\n+ZomiWLOtslp1apV6N27N7p37461a9fa1Vu9ejV69uyZ5/YK2nlNEn/99Zdd2auvvopRo0YhODjY\nrW20aNECcXFxdr8wmO3//u//YLFY8Prrr1vLJk2ahDFjxuDee+/1SpI4ceIE/ve//2H06NH4448/\ncq27YcMG/P777w7le/fuRceOHR2SxMmTJ3H16lX0799fk4Tyb4W5DCnKB0phcxNJPvDAA3zvvfdI\nku3ateOaNWt44cIFVqlShWlpaSRJi8XCyMhI/vbbb25ts2fPnnzooYc4bdo0vvjii/z222/zXOeT\nTz5hhQoV+O9//5spKSk8ffo0g4KC8jXNx4IFC/jyyy+7XH7o0CGGhoZy9+7d3LhxI2vUqMFLly5x\n3759rF27tsMUJYmJifz444/d3n9OTzzxBMePH8/nn3+ePXv2ZFZWlsu67du35zPPPONQPmLECL71\n1lusVKkSL1++bC1fvnw5e/bsyY0bN7Jly5YFjlGVLmPHjuUHH3zg0W2ikM1NPj/5ux1oKU0SU6dO\n5ZNPPslz584xICDAmhjatGnDhIQEksbJsm7dum7P87Rq1So+8cQTnDBhAidMmMBq1aoxNTXVZf3U\n1FTWrl2bCxcu5KBBg1i7dm327duXo0ePLvwbzGHWrFls3rw527RpY50Dy2KxMCoqigcPHrSre889\n97BixYp88cUX8z3HVVJSEoODg3ns2DFmZGSwXbt2fOutt5zWPXnyJEWEvXv3dljWtm1brl+/nu3a\nteP3339vLZ8yZQonTZpk7YvJyMjIV3zecvToUf7444++DkO50KZNG44cOdKj29QkUcJ99tlnvPPO\n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\nz5vg/vOf/zAkJIRDhgzJV3zO3HXXXXzqqaes273jjjusy1555RW2bNnSaXPN+PHjOWrUKMbHxzMs\nLIxfffWVy3289NJLfO6556wnzdTUVNasWdOhqc+ZK1eu8JVXXmFISEiuE1Xu2rWLNWrUYEZGBt9/\n/33rzZRr1qxhhw4dHOpPnjyZs2bNynfTZrYXXniBt912Gw8ePOh0hGCnTp3smsvCwsLsrnS2bdvG\npk2b2q2zZ88e9u7dmw0bNuTixYvZuXNnjh8/Ps8YNUkoVcT++c9/EkCh+24yMjIYExPDtWvXcsmS\nJezZs2ee61y8eDHPOgcPHmRERITdSaegTp48ybCwMH7++ecMDQ2126bFYuHQoUPZv39/u+SWmJjI\n0NBQa5PK9u3bGRkZybffftvhhPbmm2+yUaNG7NWrF9u3b8/ffvuNr7/+ut1cYe5w52TesWNHLlmy\nhE2bNrU2MV25coWVK1e2GwBw8uRJBgUF8cYbb2SfPn3yNdMxSR45coQhISG5Dr9dsWIFmzVrRovF\nwlOnTjkMdkhNTWXFihWt/Wi//PILQ0NDOWPGDOuPkCUlJfH666/Pc0CEJgmlitjLL7/M0NBQj2xr\n7ty57Nq1K8eOHctp06Z5ZJskPTqMdebMmQTAN99802FZWloa7777bnbs2JFnz56lxWJht27dHGbU\nPXjwIJs2bcqBAwdaR1otWrSINWrU4OHDh5mVlcXXX3+doaGhDAkJ4a5duzwWf7b58+ezTp06bNSo\nkd0JuUuXLnZXIVOnTuX999/Pq1ev8t///jfDw8O5bNkyp9v89ttvuW/fPruygQMH8rnnnss1FovF\nwubNm/Obb75hXFwcu3bt6lCnSZMm3LFjB5OTkxkTE+N0Wvzjx4+zVq1anDlzpsumNk0SShWxLVu2\n2E3mVxgZGRmsX78+AwICuG3bNo9s09OysrI4d+5cl4knKyuLEydOZIMGDTht2jQ2a9bMaRNLamoq\nH3vsMdasWZPTp09nWFgYd+7caVdn165dfPfdd73yPlJTUxkSEuKQ7CZPnmydWysrK4vR0dF283dt\n3LiRYWFhDv1Fy5cvZ1hYGENDQ/nBBx/QYrEwLi6O0dHR1n6c3Hz22Wfs0KEDX3vtNY4dO9Zh+T33\n3MOPPvqI/fv3txvWm1NiYiLbtWvHatWqcfjw4Vy2bJndSD5NEkr5ublz57JatWrF6ia2gnjvvfdY\n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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9a50917240>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9a509179e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Matlotlib code to plot the loss and accuracies\n",
    "eval_indices = range(0, generations, eval_every)\n",
    "# Plot loss over time\n",
    "plt.plot(eval_indices, train_loss, 'k-')\n",
    "plt.title('Softmax Loss per Generation')\n",
    "plt.xlabel('Generation')\n",
    "plt.ylabel('Softmax Loss')\n",
    "plt.show()\n",
    "\n",
    "# Plot train and test accuracy\n",
    "plt.plot(eval_indices, train_acc, 'k-', label='Train Set Accuracy')\n",
    "plt.plot(eval_indices, test_acc, 'r--', label='Test Set Accuracy')\n",
    "plt.title('Train and Test Accuracy')\n",
    "plt.xlabel('Generation')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend(loc='lower right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's see how our model runs on a test of 6 random examples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nfiS6ZNmmUincunULt27dwubmJkKhELfoBt5yMzUaDRbdT3/609jd3WWx12Fhi2FWdMnSvcnp+Fp0\nJ6jtnUOhEHK5HBwOh27bfkkoOcLhcExlpJlMJrZ0KUHhrG4AZCmThRuJRHhLpVLY2trC1tYW1tfX\neT+q50BNSovFIvb393FwcICjoyPk83ntUlgwFMdNqdpU9e0mX3dadDXXChWc8Xg88Pl8HKc7617o\ndDpnFjAha4i2cDg8Jby0uVwuAMe1eZvNJqrVKg4PD3FwcICDgwM8fvwYxWJRdxNZImbLb6rNQW8i\nWnQ118ps9ILT6eToBVpEI9E9q1Sfx+PB2toadnZ2sLW1hXA4zBv1OaOW6r1ej/3EhUIB+/v7ePDg\nAR4+fIh8Ps8dn7XoLh61IBIJrloM6SaiRVdzrVCcLlm6NpuN43TVqlGqpXuSe4FE9+WXX8Yrr7zC\nFcPC4TBsNhvvR9Yz9corFos4ODjAw4cP8cYbb6DdbnOjSc1yoMZYWywWLboazWWYLTwtpeS+aWq2\n2mg0gsfjgWEYfAG6XC64XC643W7cvn0bGxsbiMfjCAaDXMdhNsmC/LjVahX5fB7ZbBalUgm1Wo1r\nsOpi5JpFokVXc63MFp4mwZVSThUYp6aRJKRWqxV+vx+xWAyxWAy3b99GKpVi0XU4HCemE0spOfkh\nl8txSJja6FKn9moWiRZdzbUyGo0wHA5ZdK1WKwzDYIuXVqpJfFVLNxAIYH19Hdvb21y4Jh6PIxQK\nTRVDVxmPx+h2u9w6PZvNolgsol6vo91uczyutnQ1i0KLruZaGY/H6PV6aLfbaDabHD42Ho+56hvF\n8vr9fkSjUaytrcHhcGBrawvb29u4c+cO1tfXEYvFeDFu9j2oGSl18KWC5FQxrNVqXXlnYY3medCi\nq7lWyMptNBqoVCqw2WxwuVxsadLqNQCEw2Hs7OxwOc61tTUkk0msra0hFArxQtwsaiHyarWKTCaD\ndDrNLXdqtZpeONMsDVp0NdcKVfVqNBqoVqtwu93o9XoYj8e8Qq2K7t27d3mfYDDITSSdTif7cQm1\nNi4dn5pKHh0d4ejoCLlcTtfP0CwVWnQ11wpV9SJR9Pv96Pf7U5YubeFwGG63G+vr65BSctt0NUrh\npFAisoxLpRIymQxbukdHRygWixwPrNEsAzdadKnDbKvVQrVa5RVsigWlvPtut4tcLscFrZ88eYKD\n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\nDbSDKLpLjvAZAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9a07c4a278>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot some samples\n",
    "# Plot the 6 of the last batch results:\n",
    "actuals = rand_y[0:6]\n",
    "predictions = np.argmax(temp_train_preds,axis=1)[0:6]\n",
    "images = np.squeeze(rand_x[0:6])\n",
    "\n",
    "Nrows = 2\n",
    "Ncols = 3\n",
    "for i in range(6):\n",
    "    plt.subplot(Nrows, Ncols, i+1)\n",
    "    plt.imshow(np.reshape(images[i], [28,28]), cmap='Greys_r')\n",
    "    plt.title('Actual: ' + str(actuals[i]) + ' Pred: ' + str(predictions[i]),\n",
    "                               fontsize=10)\n",
    "    frame = plt.gca()\n",
    "    frame.axes.get_xaxis().set_visible(False)\n",
    "    frame.axes.get_yaxis().set_visible(False)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
